package cn.tedu.lock;

import java.util.concurrent.Semaphore;

/*
    案例：去餐馆吃饭
    餐馆中的桌子数量是有限的，当桌子被全部占用之后，后来的客人应该等待
 */
public class SemaphoreDemo {

    public static void main(String[] args) {

        Semaphore s = new Semaphore(6);

        for (int i = 0; i < 10; i++) {
            new Thread(new Eater(s)).start();
        }

    }

}

class Eater implements Runnable {

    private final Semaphore s;

    public Eater(Semaphore s) {
        this.s = s;
    }

    @Override
    public void run() {

        try {
            // 桌子的数量是有限的
            // 如果桌子被全部占用，那么后来的线程应该被阻塞
            // 获取到一个信号，信号减少一个
            s.acquire();
            System.out.println("来了一波客人，占用了一张桌子~~~");
            // 模拟：用餐花费的时间
            Thread.sleep((long) (10000 * Math.random()));
            System.out.println("客人用餐完毕，买单离开，空出来一张桌子~~~");
            // 释放一个信号，信号增加一个
            s.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
